// 任何包含 id 和 pid 字段的对象都可以转换为树形结构
interface HasIdAndPid {
  id: string | number
  pid?: string | number | null
}

// 支持泛型的通用函数 - 自动推断类型
export function flatListToTree<T extends HasIdAndPid>(list: T[]): (T & { children: T[] })[] {
  const idMap = new Map<string | number, T & { children: T[] }>()
  const tree: (T & { children: T[] })[] = []

  // 先创建所有节点的映射
  list.forEach((item) => {
    idMap.set(item.id, { ...item, children: [] })
  })

  // 建立父子关系
  list.forEach((item) => {
    const current = idMap.get(item.id)!
    if (item.pid !== undefined && item.pid !== null && item.pid !== '' && item.pid !== item.id) {
      const parent = idMap.get(item.pid)
      if (parent) {
        parent.children.push(current)
      } else {
        // 找不到父节点，作为根节点
        tree.push(current)
      }
    } else {
      // 没有父节点，作为根节点
      tree.push(current)
    }
  })

  return tree
}
